package dominio;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

@Entity
@Table(name = "solicitudCompra", uniqueConstraints = { @UniqueConstraint(columnNames = { "idSolicitud" }) })
public class SolicitudCompra implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -811970328117941741L;

	@Id
	@GeneratedValue
	private Long codigo;

	// es el id de la solicitud articulo interna
	private Long idSolicitud;

	@OneToMany(cascade = CascadeType.ALL, mappedBy = "solicitudCompra", orphanRemoval = true, fetch = FetchType.EAGER)
	private List<ArticuloItemCompra> articulosItemsCompra;

	private Estado estado;
	private Date fecha;

	public SolicitudCompra() {
		estado = Estado.CREADA;
		fecha = new Date();
	}

	public SolicitudCompra(Long idSolicitud) {
		this();
		this.idSolicitud = idSolicitud;
	}

	public Long getCodigo() {
		return codigo;
	}

	public List<ArticuloItemCompra> getArticulosItemsCompra() {
		return articulosItemsCompra;
	}

	public Long getIdSolicitud() {
		return idSolicitud;
	}

	public void setCodigo(Long codigo) {
		this.codigo = codigo;
	}

	public Date getFecha() {
		return fecha;
	}

	public String getFechaString() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sdf.format(fecha);
	}

	public void setArticulosItemsCompra(
			List<ArticuloItemCompra> articulosItemsCompra) {
		this.articulosItemsCompra = articulosItemsCompra;
	}

	public Estado getEstado() {
		return estado;
	}

	public void recibir() {
		for (ArticuloItemCompra articuloItemCompra : articulosItemsCompra) {
			articuloItemCompra.fabricado();
		}
		this.estado = Estado.RECIBIDA;
	}

	public boolean estaRecibida() {
		return Estado.RECIBIDA.equals(estado);
	}

	public boolean estaCreada() {
		return Estado.CREADA.equals(estado);
	}

	public boolean estaEnviada() {
		return Estado.ENVIADA.equals(estado);
	}

	public void add(ArticuloItemCompra articuloItemCompra) {
		if (this.articulosItemsCompra == null) {
			this.articulosItemsCompra = new ArrayList<ArticuloItemCompra>();
		}
		this.articulosItemsCompra.add(articuloItemCompra);
	}

	public void enviada() {
		this.estado = Estado.ENVIADA;
	}

	/**
	 * "{\"numero\": 1 , \"codigoDeposito\": 9 , \"fechaEmision\": \"20131103\"
	 * , \"itemSolicitudCompraVOs\": [ { \"articuloVO\": { \"codigo\": 2 ,
	 * \"nombre\": \"prueba 1\", \"descripcion\": \"prueba numero 1\",
	 * \"marca\":\"nose\",\"precio\":\"10\",\"foto\":\"\",
	 * \"origen\":\"argentina\" } , \"cantidad\": 20 }, { \"articuloVO\": {
	 * \"codigo\": 2 , \"nombre\": \"prueba 1\", \"descripcion\": \"prueba
	 * numero 1\", \"marca\":\"nose\", \
	 * "precio\":\"10\",\"foto\":\"\",\"origen\":\"argentina\" } , \"cantidad\": 20 }]}\";"
	 * ;
	 */
	@SuppressWarnings("unchecked")
	public String toJson() {

		JSONObject obj = new JSONObject();
		obj.put("idSolicitud", this.codigo);

		JSONArray list = new JSONArray();
		List<ArticuloItemCompra> articulosItemsCompra = this
				.getArticulosItemsCompra();
		for (ArticuloItemCompra articuloItemCompra : articulosItemsCompra) {
			JSONObject articuloJson = new JSONObject();
			articuloJson.put("codigoArticulo",
					articuloItemCompra.getCodigoArticulo());
			articuloJson.put("cantidadSolicitada",
					articuloItemCompra.getCantidadSolicitada()
							- articuloItemCompra.getCantidadFabricada());
			list.add(articuloJson);
		}
		obj.put("articulosItemsCompra", list);
		return obj.toJSONString();
	}

	@Override
	public String toString() {
		return "SolicitudCompra ["
				+ (codigo != null ? "codigo=" + codigo + ", " : "")
				+ (idSolicitud != null ? "idSolicitud=" + idSolicitud + ", "
						: "")
				+ (articulosItemsCompra != null ? "articulosItems="
						+ articulosItemsCompra + ", " : "")
				+ (estado != null ? "estado=" + estado : "") + "]";
	}
}
